home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Freelog 4
/
FREELOG 4.iso
/
Prog
/
Delphi
/
Etape2
/
Unit1.~pa
< prev
next >
Wrap
Text File
|
1999-07-19
|
8KB
|
328 lines
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DXClass, DXDraws, DXSprite, DXInput;
type
TForm1 = class(TDXForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
DXTimer1: TDXTimer;
DXSpriteEngine1: TDXSpriteEngine;
DXInput1: TDXInput;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
procedure FormCreate(Sender: TObject);
private
{ DΘclarations privΘes }
public
{ DΘclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// ***************************
// La structure pour les mΘchants
// ***************************
type
TMechantSprite = class( TImageSprite)
private
// Le sens de dΘplacement (droite ou gauche ?)
FSens : Integer;
protected
// Pour les dΘplacements
procedure DoMove( MoveCount : Integer);override;
public
// Pour la crΘation
constructor Create( AParent : TSprite);override;
end;
// Le tableau des mΘchants
var Mechants : Array[1..50] of TMechantSprite;
var nNbEnnemis : Integer;
// ***************************
// La structure pour le joueur
// ***************************
type
TPlayerSprite = class( TImageSprite)
private
// Le nombre de tirs
FNumberShoot : Integer;
// Les dΘlais pour les tirs
FCounter : Integer;
FOldShootCounter : Integer;
protected
// La procΘdure appellΘe pour les dΘplacements du joueurs
procedure DoMove( MoveCount : Integer);override;
procedure DoCollision( Sprite : TSprite; var Done : Boolean); override;
public
// La procΘdure apellΘe pour crΘer le joueur
constructor Create( AParent : TSprite);override;
end;
// La variable du joueur
var Player : TPlayerSprite;
// ***************************
// La structure du tir du joueur
// ***************************
type
TShootSprite = class( TImageSprite)
private
// Quel est le joueur qui tire ?
FPlayer : TPlayerSprite;
protected
// Les dΘplacements et la gestion des collisions
procedure DoMove( MoveCount : Integer) ; override;
procedure DoCollision( Sprite : TSprite; var Done : Boolean); override;
public
// CrΘation et destruction des missiles
constructor Create( AParent : TSprite); override;
destructor Destroy;override;
end;
// Initalisation des ennemis
constructor TMechantSprite.Create( AParent : TSprite);
begin
inherited Create( AParent);
// Affecte le dessin correspondant
Image := Form1.DXImageList1.Items.Find( 'vaisseau');
// La profondeur de cet objet (pour les transparences)
Z := 2;
Width := Image.Width;
Height := Image.Height;
// Sens de dΘplacement
FSens := 1;
end;
procedure TMechantSprite.DoMove( MoveCount : Integer);
begin
inherited DoMove( MoveCount);
// DΘplacement
X := X + Int((MoveCount * (300/1000))) * FSens;
// Si l'un des bords est atteind, on change le sens de dΘplacement
if (X > (Form1.DXDraw1.Width - Width)) Or ( X< 0) then
begin
FSens := - FSens;
Y := Y + 5;
end
end;
// ***************************
// Les procΘdures et fonctions du joueur
// ***************************
constructor TPlayerSprite.Create( AParent : TSprite);
begin
inherited Create( AParent);
Image := Form1.DXImageList1.Items.Find( 'joueur');
Z := 2;
Width := Image.Width;
Height := Image.Height;
FNumberShoot := 0;
X := (Form1.DXDraw1.Width- Width) div 2;
Y := Form1.DXDraw1.Height- Height;
end;
procedure TPlayerSprite.DoMove( MoveCount : Integer);
begin
inherited DoMove( MoveCount);
// Teste l'Θtat des entrΘes (clavier et joystick) et bouge en consΘquence
// Est-ce que le joueur va α droite ?
if isRight in Form1.DXInput1.States then
begin
X := X + (300/1000) * MoveCount;
end;
// Est-ce que le joueur va α gauche ?
if isLeft in Form1.DXInput1.States then
begin
X := X - (300/1000) * MoveCount;
end;
// Est-ce que le joueur monte ?
if isUp in Form1.DXInput1.States then
begin
Y := Y - (300/1000) * MoveCount;
end;
// Le joueur descend
if isDown in Form1.DXInput1.States then
begin
Y := Y + (300/1000) * MoveCount;
end;
// Le joueur appuie sur le bouton 1
if isButton1 in Form1.DXInput1.States then
begin
// On a tirΘ moins de 3 missiles et l'espace entre deux missiles et suffisant
if (FNumberShoot < 3) And ( (FCounter-FOldShootCounter) >=100)then
begin
Inc( FNumberShoot);
TShootSprite.Create( Engine);
FOldShootCounter := FCounter;
end;
end;
// Mise α jour du compteur pour les tirs
FCounter := FCounter + MoveCount;
// Borne les dΘplacements du joueur
if X < 0 then
X := 0;
if X > (Engine.Width-Width) then
X := (Engine.Width-Width);
if Y < 0 then
Y := 0;
if Y > (Engine.Height - Height) then
Y := (Engine.Height -Height );
// Teste les collisions
Collision;
end;
procedure TPlayerSprite.DoCollision( Sprite : TSprite; var Done : Boolean);
begin
if Sprite is TMechantSprite then
begin
Dead;
Form1.Close;
end;
Done := False;
end;
// **********************************************
// Les procΘdures et fonctions des tirs du joueur
// **********************************************
constructor TShootSprite.Create( AParent : TSprite);
begin
inherited Create( AParent);
// Affecte ce tir au joueur
FPlayer := Player;
Image := Form1.DXImageList1.Items.Find( 'laser');
Z := 2;
Width := Image.Width;
Height := Image.Height;
// Positionne le missile au centre du vaisseau
X := FPlayer.X+FPlayer.Width div 2 -3;
Y := FPlayer.Y+Height;
end;
destructor TShootSprite.Destroy;
begin
// On "tue" le missile => dΘcrΘmente le nombre de tir
Dec( FPlayer.FNumberShoot);
inherited Destroy;
end;
procedure TShootSprite.DoMove( MoveCount : Integer);
begin
inherited DoMove( MoveCount);
Y := Y - (800/1000)*MoveCount;
// Teste les collisions du missile
Collision;
// On sort de l'Θcran => "tue" le sprite
if Y <= 0 then
Dead;
end;
procedure TShootSprite.DoCollision( Sprite : TSprite; var Done : Boolean);
begin
// Si le missile touche un mechant => Il meurt et c'est bien fait !
if Sprite is TMechantSprite then
begin
Dec (nNbEnnemis);
// Tue le mΘchant
Sprite.Dead;
// "Tue" le missile
Dead;
end;
Done := False;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_ESCAPE then
Close;
if ( ssAlt in Shift) And( Key = VK_RETURN) then
begin
DXDraw1.Finalize;
if doFullScreen in DXDraw1.Options then
begin
RestoreWindow;
DXDraw1.Cursor := crDefault;
BorderStyle := bsSizeable;
DXDraw1.Options := DXDraw1.Options-[doFullScreen];
end
else
begin
StoreWindow;
DXDraw1.Cursor := crNone;
BorderStyle := bsNone;
DXDraw1.Options := DXDraw1.Options+[doFullScreen];
end;
DXDraw1.Initialize;
end;
end;
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if Not DXDraw1.CanDraw then Exit;
// Actualisation des entrΘes de l'utilisateur
DXInput1.Update;
// Fais bouger tout le petit monde ( 60 images par secondes)!
DXSpriteEngine1.Move( 1000 div 60);
DXSpriteEngine1.Dead;
// Efface l'Θcran
DXDraw1.Surface.Fill(0);
// Affiche les sprites
DXSpriteEngine1.Draw;
// Rend visible l'Θcran
DXDraw1.Flip;
// Il n'y a plus d'ennemis
if nNbEnnemis <= 0 then
Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
var i, j, k : Integer;
begin
// CrΘation des mΘchants
k := 0;
for j := 1 to 5 do
begin
for i := 1 to 10 do
begin
Mechants[k] := TMechantSprite.Create( DXSpriteEngine1.Engine);
With Mechants[k] do
begin
X := i*Mechants[k].Width;
Y := j*Mechants[k].Height;
end;
k := k + 1;
end;
end;
// Initialisation du nombre maxi d'ennemis
nNbEnnemis := 50;
// CrΘation du joueur
Player := TPlayerSprite.Create( DXSpriteEngine1.Engine);
end;
end.